# $OpenBSD: tests,v 1.5 2009/10/13 20:53:40 miod Exp $
# $NetBSD: tests,v 1.9 2005/03/15 18:27:23 bouyer Exp $

#fill up an extent, should coalesce into one allocation
extent test1 0 0x4f
alloc_region 0x00 0x10
alloc_region 0x20 0x10
alloc_region 0x40 0x10
alloc_region 0x10 0x10
alloc_subregion 0 0x4f 0x10
print

#check whether subregion is obeyed (PR kern/7539)
extent test2 0 0x2f EX_NOCOALESCE
alloc_region 0x00 0x10
alloc_subregion 0x20 0x2f 0x10
print

#check overlap into subregion (fixed in 1.25)
extent test3 0 0x3f EX_NOCOALESCE
alloc_region 0x00 0x20
alloc_region 0x30 0x10
alloc_subregion 0x10 0x3f 0x10
print

#check overflow in boundary check, before an allocated region (fixed in 1.32)
extent test4 0xf0000000 0xffffffff
alloc_region 0xf1000000 0x1
boundary 0x20000000
alloc_subregion 0xf0000000 0xffffffff 0x1
print

#check overflow in boundary check, before the subregion end (fixed in 1.32)
extent test5 0xf0000000 0xffffffff
boundary 0x20000000
alloc_subregion 0xf0000000 0xffffffff 0x1
print

#check allocation beyond last boundary line (to be fixed)
# last two allocations should succeed without boundary "fixups"
extent test6 0 11
boundary 8
alloc_subregion 0 11 8
alloc_subregion 0 11 2
alloc_subregion 0 11 2
print

#check allocation beyond last boundary line (to be fixed)
# last allocation should be bumped to the next boundary and exactly fit
# the remaining space
extent test7 0 11
boundary 8
alloc_subregion 0 11 7
alloc_subregion 0 11 4
print

#don't allocate a region pasts the end of subregion (i.e., the second
#alloc_subregion should fail).  subr_extent.c prior to rev. 1.43 allocates
#region starts from 0x10.
extent test8 0 0x4f EX_NOCOALESCE
alloc_region 0x30 0x10
alloc_subregion 0 0xf 0x10
alloc_subregion 0 0xf 0x10
print

#When allocating a region with a boundary constraint, check that we properly
#detect overlaps once the candidate region has been aligned.
#subr_extent.c prior 1.45 could corrupt the extent map in this situation
extent test9 0 0x4f
boundary 0
alloc_subregion 0 0x10 4
alloc_subregion 0xd 0x20 2
boundary 8
alloc_subregion 0 0x4f 8
print

#check that free works
extent test10 0xc0002000 0xffffe000 EX_BOUNDZERO
boundary 0x10000
align 0x10000
alloc_subregion 0xc0002000 0xffffe000 0x2000
alloc_subregion 0xc0002000 0xffffe000 0x2000
print
free 0xc0020000 0x2000
print
alloc_subregion 0xc0002000 0xffffe000 0x10000
print
#If we have something like that in the EX_NOCOALESCE case:
#extent `test11' (0x10 - 0x20), flags = 0x2
#  0x10 - 0x13
#  0x1e - 0x1f
#  0x20 - 0x20
#then a new extent of size 1 could be allocated at 0x20.
# fixed in 1.51
extent test11 0x10 0x20 EX_NOCOALESCE
alloc_subregion 0x10 0x13 0x4
alloc_subregion 0x1e 0x1f 0x2
alloc_subregion 0x20 0x20 0x1
alloc_subregion 0x20 0x20 0x1
alloc_subregion 0x10 0x20 0x1
print

# Overlapping regions should result in a failure
extent test12 0x00000000 0xffffffff
alloc_region 0xfce00000 0x100
alloc_region 0xfce00000 0x100000

# But not if we specify EX_CONFLICTOK
extent test13 0x00000000 0xffffffff
alloc_region 0xfce00000 0x100
alloc_region 0xfce00000 0x100000 EX_CONFLICTOK
print

# Check partial overlap
extent test14 0x00000000 0xffffffff
alloc_region 0xfce00000 0x1000
alloc_region 0xfce00100 0x1000 EX_CONFLICTOK
print

# Check multiple overlaps
extent test15 0x00000000 0xffffffff
alloc_region 0xfce00000 0x100
alloc_region 0xfee00000 0x100
alloc_region 0xf8000000 0x8000000 EX_CONFLICTOK
print

# Check coallescing in combination with overlaps
extent test16 0x00000000 0xffffffff
alloc_region 0x0 0xa0000
alloc_region 0xf0000 0x1ff10000
alloc_region 0xa0000 0x60000 EX_CONFLICTOK
print

# Check allocation of a conflicting region in an otherwise filled
# extent does not trigger an infinite loop
extent test17 0x00000000 -1L EX_FILLED
alloc_region 0 0x4000 EX_CONFLICTOK
print
